import 'package:geolocator/geolocator.dart';
import 'package:location_test/app/data/datasources/platform/battery_service.dart';
import 'package:location_test/app/data/datasources/platform/bluetooth_service.dart';
import 'package:location_test/app/data/datasources/platform/location_service.dart';
import 'package:location_test/app/domain/models/ble_beacon.dart';
import 'package:location_test/app/domain/repositories/device_repository.dart';
import 'package:nmea_plugin/nmea_plugin.dart';

// "implements IDeviceRepository" 是一个承诺。
// 它保证这个类会提供 IDeviceRepository 接口中定义的所有方法。
// 这就像经理承诺会完成 CEO 布置的所有任务。
class DeviceRepositoryImpl implements IDeviceRepository {
  // 经理手下的员工。这些都是通过构造函数从 "HR"(DependencyInjection) 那里分配来的。
  final LocationService _locationService;
  final BatteryService _batteryService;
  final BluetoothService _bluetoothService;

  // 构造函数：当 HR(GetX) 创建这个经理时，会把需要的员工传递进来。
  // 注意：根据上面的分析，我们已经不需要 NmeaService 了。
  DeviceRepositoryImpl(
    this._locationService,
    this._batteryService,
    this._bluetoothService,
  );

  @override
  Stream<int> getBatteryLevelStream() {
    // 经理自己不去获取电量，而是把任务委托给专业的 "电池员工" (_batteryService)。
    return _batteryService.getBatteryLevelStream();
  }

  @override
  Stream<NmeaMessage> getNmeaMessageStream() {
    // 这里是关键！当被要求提供 NMEA 消息流时，
    // 这个仓库直接使用了我们新创建的 `nmea_plugin`。
    // 它调用 NmeaPlugin() 这个单例，并获取其提供的流。
    // 这使得 NMEA 功能的来源非常清晰，就是来自这个插件。
    return NmeaPlugin().getNmeaMessageStream();
  }

  @override
  Stream<Position> getPositionStream() {
    // 同样，将获取位置的任务委托给 "定位员工" (_locationService)。
    return _locationService.getPositionStream();
  }

  @override
  Stream<List<BleBeacon>> getBleBeaconStream() {
    return _bluetoothService.beaconStream;
  }

  @override
  Future<void> startBleScan() {
    return _bluetoothService.startScanning();
  }

  @override
  Future<void> stopBleScan() {
    return _bluetoothService.stopScanning();
  }
}
